package inge_soft.gestoriusNuevo.business.controller.implementation;

import inge_soft.gestoriusNuevo.business.logic.BuscadorMemoria;
import inge_soft.gestoriusNuevo.business.service.abstraction.IInstitucionService;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Domicilio;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.DomicilioTipificado;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Institucion;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Localidad;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Pais;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Provincia;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.TipoDomicilio;
import inge_soft.gestoriusNuevo.support.SecurityUtil;
import inge_soft.gestoriusNuevo.support.UsuarioSistema;

import java.util.ArrayList;
import java.util.List;

import org.springframework.dao.DataAccessException;
import org.zkoss.bind.annotation.AfterCompose;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ExecutionArgParam;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.Sessions;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class CrearModificarDomicilioViewModel {

	/* puesto aca para zafar, refactorear, pasarlo a otro archivo .java */
	public enum Estado {
		CREANDO,
		MODIFICANDO
	}
	
	@WireVariable("institucionService")
	private IInstitucionService servicioInstitucion;
	
	private String tituloVentana;
	
	private List<Pais> listaPaises;
	private List<Provincia> listaProvincias;
	private List<Localidad> listaLocalidades;
	
	private List<Localidad> listaLocalidadesConsultadas;
	
	private List<TipoDomicilio> listaTiposDomicilio;
	
	private DomicilioTipificado domicilioProcesado;
	private Institucion institucion;
	private String nombreUsuario;

	private Pais paisElegido;
	private Provincia provinciaElegida;
	private Localidad localidadElegida;
	
	private Estado estado;
	
	private BuscadorMemoria buscador;
	
	@Init
	public void init() {
		listaPaises = servicioInstitucion.obtenerPaises();
		listaTiposDomicilio = servicioInstitucion.obtenerTipoDomicilios();
		listaProvincias = new ArrayList<Provincia>();
		listaLocalidades = new ArrayList<Localidad>();
		
		buscador = new BuscadorMemoria(new ArrayList<Localidad>());
	}
	
	@AfterCompose
	public void doAfterCompose( ) {
		
		institucion = (Institucion)Sessions.getCurrent().getAttribute("Institucion");
		nombreUsuario = ((UsuarioSistema) SecurityUtil.getUser()).getUsername();;
		
		DomicilioTipificado domicilioTipificado = (DomicilioTipificado) Sessions.getCurrent().getAttribute("DomicilioTipificado");
		
		if (domicilioTipificado == null) {
			setEstado(Estado.CREANDO);
			
			//DEPURACION
			System.out.println("do after compose, el domicilio es null");
			//DEPURACION
			
			DomicilioTipificado domicilioTipificadoAux = new DomicilioTipificado();
			domicilioTipificadoAux.setDomicilio(new Domicilio());
			
			this.setDomicilioProcesado(domicilioTipificadoAux);
			this.setTituloVentana("Creando Domicilio para la institucion: " + institucion.getRazonSocial());
		} else {
			setEstado(Estado.MODIFICANDO);
			
			//DEPURACION
			System.out.println("do after compose, el domicilio NO ES null");
			//DEPURACION
			
			this.domicilioProcesado = domicilioTipificado;
			this.paisElegido = domicilioTipificado.getDomicilio().getLocalidad().getProvincia().getPais();
			this.provinciaElegida = domicilioTipificado.getDomicilio().getLocalidad().getProvincia();
			this.
			cambioPais();
			cambioLocalidad(null);
			
			// toquetear localidad del domicilio del domicilioTipificado!!! (modificacion)
			//this.localidadElegida = domicilioTipificado.getDomicilio().getLocalidad();
			this.setTituloVentana("Modificando Domicilio para la institucion: " + institucion.getRazonSocial());
		}
	}

	@Command @NotifyChange("listaProvincias")
	public void cambioPais() {
		listaProvincias = servicioInstitucion.obtenerProvincias(paisElegido);
	}
	
	@Command
	public void cambioProvincia() {
		setLocalidadElegida(null);
		listaLocalidadesConsultadas = servicioInstitucion.obtenerLocalidades(provinciaElegida);
		buscador = new BuscadorMemoria(listaLocalidadesConsultadas);
		//DEPURACION
		System.out.println("cambio provincia");
		//DEPURACION
	}
	
	@Command @NotifyChange("listaLocalidades")
	public void cambioLocalidad(@BindingParam("comboBox") Combobox comboBoxLocalidad) {
		if(comboBoxLocalidad!=null){
		String cadenaIngresada = comboBoxLocalidad.getValue();
		//DEPURACION
		System.out.println("el leng es: " + cadenaIngresada.length());
		//DEPURACION
		if (cadenaIngresada.length() < 3) { // si la cadena no supera la cantidad de caracteres minima..
			listaLocalidades = new ArrayList<Localidad>();
			return;
		}
		listaLocalidades = buscador.buscarParecidas(cadenaIngresada);
		//DEPURACION
		System.out.println("cambio localidad: " + cadenaIngresada);
		//DEPURACION
		}
		else{
			listaLocalidades = servicioInstitucion.obtenerLocalidades(provinciaElegida);
		}
	}
	
	@Command
	public void cerrar(@BindingParam("idVentana") Window idVentana) {
		Sessions.getCurrent().setAttribute("Institucion", institucion);
		Sessions.getCurrent().setAttribute("DomicilioTipificado", null); // Luego de utilizarlo, lo dejo en blanco
		Executions.getCurrent().sendRedirect("index.zul?destino=CrearYmodificarInstitucion.zul","");
	}
	
	@Command
	public void guardar() {
		System.out.println("Tipo Domicilio: " + domicilioProcesado.getTipoDomicilio().getTipo());
		if (estado.equals(Estado.CREANDO)) {
			System.out.println("Institucion: "+institucion);
			System.out.println("Domicilios: "+institucion.getDomicilios());
			System.out.println("Domicilio Actual: "+ domicilioProcesado);
			
			try {
				servicioInstitucion.crearDomicilio(nombreUsuario, institucion,domicilioProcesado);
			} catch (DataAccessException e) {
				//SEGUIR TRABAJANDO ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
				//removerNoPersistido(institucion.getDomicilios()); // remover NO persistidos o acomodar equal para que ande si ID y listo ;)
				Messagebox.show(e.getMessage());
				return;
			}
		} else if (estado.equals(Estado.MODIFICANDO)) {
			try {
				servicioInstitucion.modificarDomicilio(nombreUsuario, institucion,domicilioProcesado);
			} catch (DataAccessException e) {
				Messagebox.show(e.getMessage());
				return;
			}
		}
		
		setEstado(Estado.MODIFICANDO);
		String mensajeCorrecto = "El domicilio se almaceno con exito";
		Messagebox.show(mensajeCorrecto);
	}

	public String getTituloVentana() {
		return tituloVentana;
	}

	public void setTituloVentana(String tituloVentana) {
		this.tituloVentana = tituloVentana;
	}

	public List<Pais> getListaPaises() {
		return listaPaises;
	}

	public void setListaPaises(List<Pais> listaPaises) {
		this.listaPaises = listaPaises;
	}

	public List<Provincia> getListaProvincias() {
		return listaProvincias;
	}

	public void setListaProvincias(List<Provincia> listaProvincias) {
		this.listaProvincias = listaProvincias;
	}

	public List<Localidad> getListaLocalidades() {
		return listaLocalidades;
	}

	public void setListaLocalidades(List<Localidad> listaLocalidades) {
		this.listaLocalidades = listaLocalidades;
	}

	public DomicilioTipificado getDomicilioProcesado() {
		return domicilioProcesado;
	}

	public void setDomicilioProcesado(DomicilioTipificado domicilioProcesado) {
		this.domicilioProcesado = domicilioProcesado;
	}

	public Pais getPaisElegido() {
		return paisElegido;
	}

	public void setPaisElegido(Pais paisElegido) {
		this.paisElegido = paisElegido;
	}

	public Provincia getProvinciaElegida() {
		return provinciaElegida;
	}

	public void setProvinciaElegida(Provincia provinciaElegida) {
		this.provinciaElegida = provinciaElegida;
	}

	public Localidad getLocalidadElegida() {
		return localidadElegida;
	}

	public void setLocalidadElegida(Localidad localidadElegida) {
		this.localidadElegida = localidadElegida;
	}

	public List<TipoDomicilio> getListaTiposDomicilio() {
		return listaTiposDomicilio;
	}

	public void setListaTiposDomicilio(List<TipoDomicilio> listaTiposDomicilio) {
		this.listaTiposDomicilio = listaTiposDomicilio;
	}

	public Estado getEstado() {
		return estado;
	}

	public void setEstado(Estado estado) {
		this.estado = estado;
	}
	
	
}
